[dbt] Analysesでアドホックなクエリを開発する
大阪オフィスの玉井です。
今回は「使うのは簡単だけど、使いどころがイマイチよくわからない」って感じの機能であるAnalysesをご紹介します。
Analysesとは
dbtプロジェクトの中にanalyses
というディレクトリがあるのですが、その中にSQLファイルを配置することができます。そのクエリ群をAnalysesと呼称します。
dbtユーザーの方からすれば、「dbtプロジェクトの中にあるSQLファイル」って、それってModelじゃないの??って感じですよね。ですので、Modelとの違いを記します。
dbt run
の対象外- 実体化されない(テーブルやビューにならない)
- Jinjaやマクロ等は使える(Modelを開発するときと全く同じ環境でSQLが書ける)
つまり、dbtの中にあるんだけども、実際にデータは作らないSQLがAnalysesといえます。
使いみち
上記を見ると、「どこで使う機能なんだ?」と疑問を持たずにいられない感じですが、個人的に思いつくのは下記の通りです。
単発クエリ
データモデルを開発している中で、実際に作る前に、検証等でちょっと一時的に実行したいクエリっていうのが出てきます。
普通のSQLクライアントとかでやってもいいのですが、Analysesで行うことで、「Jinjaやマクロを使ってSQLが書ける」「dbtプロジェクトとしてバージョン管理ができる」というメリットを享受できます。
BIツール用のクエリ
TableauやLookerといったBIツールには、そのツールからSQLを発行して、それで取得したデータを分析する、という機能があります。
こちらも、別にBIツール上でSQLを書いてもいいのですが、上記同様、Analysesを使用することで、dbtのメリットを活かしながら、BIツール用のクエリを開発することができます(まあ、BIツール用なんだったら、ちゃんとModelとしてテーブルやビューを作ってあげるにこしたことはないと思いますが)。
やってみた
環境
- dbt Cloud
- dbt v1.0
analysesディレクトリ下にSQLファイルを作成する
やることは単純です。見出しの通り、SQLファイルを用意します(クエリはLearn Analytics Engineering with dbt | dbt Learnのものをお借りします)。
WITH payments AS( SELECT * FROM {{ ref('stg_payments') }} ), aggregated AS( SELECT SUM(amount) AS total_revenue FROM payments WHERE status = 'success' ) SELECT * FROM aggregated
で、このクエリなのですが、結果は1つの値が返ってくるだけです。こういうModelにするようなデータではない…というものも、analysesの使いどころかなと思います(それこそBIツール側に渡してあげても良さそう)。
また、このクエリにはref
を使って、別のデータモデルを参照していますが、当然ながら、コンパイル後は、ちゃんとしたクエリになります。
Jinjaやマクロを活用して、効率良く「一時的なクエリ」が書けるというわけですね。
dbt compile
する
dbt Cloudであれば、上記のように、画面上で気軽にクエリをコンパイルすることができますが、一応、正式なコンパイル方法としては、dbtコマンドのdbt compile
を実行することです。このコマンドは、dbtプロジェクトのModelやAnalysesのクエリをコンパイルしてくれます。
コンパイルされたクエリは、target
ディレクトリ下に作成されます。
おわりに
使いどころが絶妙な機能ではありますが、結果をテーブルやビューとして作るまでもないクエリについては、Analysesで書いてみるのも良いと思います。